Skip to main content

Configuration File Setup

Configuration File (config.yaml)

SMOCS uses a combination of environment variables (.env file) and YAML configuration (config.yaml) to manage system settings. This separation keeps sensitive credentials separate from application logic.This section will go through the configuration file required for information you do want to publish and share.

Location and Loading

The main configuration file is located at:

SMOCS/orchestration/config.yaml

Override the path with:

CONFIG_PATH=/path/to/custom/config.yaml

Configuration Structure

The config.yaml file is organized into logical sections:

# Data source selection
source: "gymnasium"

# Source-specific configurations
mqtt:
# MQTT topic configurations

epics:
# EPICS PV configurations

gymnasium:
# Gymnasium environment settings

# Kafka settings
kafka:
# Topic management settings

# Agent configurations
autoencoder_agent1:
# First autoencoder agent settings

rl_control_agent1:
# First RL agent settings

# Project metadata
project:
name: "smocs-project-name"

Source Configuration

source: "gymnasium"  # Options: "gymnasium", "mqtt", "epics"

Purpose: Identifies the primary data source for the system (for documentation/tracking).


MQTT Configuration

Basic MQTT Setup

mqtt:
topics:
- topic: "sensor/temperature/room1"
channel_paths:
temperature: "value"
humidity: "humidity"
timestamp_path: "timestamp"

- topic: "sensor/pressure/tank1"
channel_paths:
pressure_value: "reading.pressure"
pressure_unit: "reading.unit"
timestamp_path: "reading.timestamp"

MQTT Topic Configuration Fields

FieldTypeRequiredDescription
topicstringYesMQTT topic to subscribe to
channel_pathsdictYesMapping of channel names to JSON paths
timestamp_pathstringNoJSON path to timestamp field

Channel Path Syntax

Use dot notation to navigate nested JSON:

// MQTT Message
{
"sensor": {
"reading": {
"value": 23.5,
"unit": "celsius"
}
},
"timestamp": "2025-01-15T10:30:00Z"
}
# Configuration
channel_paths:
temperature: "sensor.reading.value"
unit: "sensor.reading.unit"
timestamp_path: "timestamp"

Complex MQTT Example

mqtt:
topics:
- topic: "bl-fermi-01-dump/blinky-hub/blinky-mqtt/flowMeter-01/reading"
channel_paths:
rate1_value: "rate1.value"
rate1_low: "rate1.alarm.limits.low"
rate1_high: "rate1.alarm.limits.high"
rate2_value: "rate2.value"
rate2_low: "rate2.alarm.limits.low"
rate2_high: "rate2.alarm.limits.high"
rate3_value: "rate3.value"
rate3_low: "rate3.alarm.limits.low"
rate3_high: "rate3.alarm.limits.high"
timestamp_path: "timeStamp"

Result: Extracts 9 channels from a complex nested message structure.


EPICS Configuration

Basic EPICS Setup

epics:
source: CEBAF
PVs:
- IPMK203.XPOS
- IPMK203.YPOS
- IPMK203.PHAS
- IPMK101.XPOS
- IPMK101.YPOS
- IPMK101.PHAS

EPICS Configuration Fields

FieldTypeRequiredDescription
sourcestringYesSource identifier (becomes Kafka topic)
PVslistYesList of EPICS Process Variable names

How EPICS Integration Works

EPICS IOCs → Channel Access → epics-kafka-producer → Kafka Topic

Topic: "CEBAF"
Message: {
"timestamp": 1234567890,
"channels": {
"IPMK203.XPOS": 1.23,
"IPMK203.YPOS": -0.45,
...
}
}

Key Points:

  • All PVs are polled at 1-second intervals
  • Data is published to a single Kafka topic (source name)
  • Channel names match PV names exactly

Gymnasium Configuration

Complete Gymnasium Configuration

gymnasium:
# Environment Selection
environment: "Pendulum-v1" # Any Gym environment ID

# Rendering
render_mode: null # Options: null, 'human', 'rgb_array'
max_episode_steps: null # null = use environment default

# Kafka Topics
input_topic: "gymnasium-action"
output_topics:
sarsa: "gymnasium-sarsa" # Full SARSA tuples
state: "gymnasium-state" # State-only messages
decomposed: "gymnasium-output" # Flattened data for monitoring

# Operation Mode
blocking_mode: false # true = wait for Kafka actions
default_action_strategy: "random" # 'random' or 'zero'

# Timing
step_delay: 0.0 # Seconds between steps
reset_on_start: true # Reset environment on startup

Gymnasium Configuration Fields

FieldTypeDefaultDescription
environmentstringRequiredGymnasium environment ID
render_modestring/nullnullVisualization mode
max_episode_stepsint/nullnullEpisode length limit
input_topicstringRequiredTopic for actions
output_topicsdictRequiredTopics for observations
blocking_modebooltrueWait for actions vs use defaults
default_action_strategystring"random"Action when none received
step_delayfloat0.0Delay between environment steps
reset_on_startbooltrueReset on container start

Gymnasium Environment Options

SMOCS supports any Gymnasium environment:

Classic Control:

  • CartPole-v1
  • Pendulum-v1
  • MountainCar-v0
  • Acrobot-v1

MuJoCo (requires MuJoCo license):

  • Ant-v4
  • HalfCheetah-v4
  • Hopper-v4
  • Humanoid-v4

Custom Environments:

gymnasium:
environment: "SCORE-IndustryParticleAccelerator-v0" # Custom registered env

Blocking vs Non-Blocking Mode

Blocking Mode (blocking_mode: true):

Environment → Wait for Kafka action → Execute → Publish state → Wait...
  • Use when: RL agent controls all actions
  • Behavior: Environment pauses until action received
  • Pros: Precise control, no wasted computation
  • Cons: Deadlocks if agent fails

Non-Blocking Mode (blocking_mode: false):

Environment → Check Kafka → Use action OR default → Execute → Publish → Loop
  • Use when: Testing, development, fallback behavior needed
  • Behavior: Uses default actions when none available
  • Pros: Keeps running even if agent fails
  • Cons: May execute unintended actions

Kafka Configuration

kafka:
auto_create: true # Automatically create topics
partitions: 1 # Default partition count
replication_factor: 1 # Replication factor

Kafka Configuration Fields

FieldTypeDefaultDescription
auto_createbooltrueCreate topics automatically
partitionsint1Number of partitions per topic
replication_factorint1Replication factor for durability

Production Recommendations:

  • partitions: 3-6 for parallelism
  • replication_factor: 3 for high availability
  • auto_create: false (pre-create topics with proper config)

Agent Configuration

Autoencoder Agent Configuration

autoencoder_agent1:
# Preprocessing Pipeline
preprocessing_pipeline:
- bounds_normalizer
- window_processor

# Model Architecture
window_size: 5
encoder_dims: [64, 32, 16]

# Training Parameters
min_training_samples: 100
learning_rate: 0.0001
batch_size: 16
samples_multiplier: 3
epochs: 10

# Thread Control
enabled_threads: ['ingest', 'training', 'inference']

# Model Input Specification
model_input:
channels:
- state_0
- state_1
- state_2
bounds:
- [-1.0, 1.0]
- [-1.0, 1.0]
- [-8.0, 8.0]

# Model Output
model_output:
channels:
- state_0
- state_1
- state_2

# Kafka Topics
kafka_topics:
input: "gymnasium-output"
output: "autoencoder1-anomalies"
training_output: "autoencoder1-training-results"

Autoencoder Configuration Fields

FieldTypeRequiredDescription
preprocessing_pipelinelistYesOrdered list of preprocessors
window_sizeintYesTimesteps per training window
encoder_dimslistYesLayer sizes for encoder
min_training_samplesintYesMinimum samples before training
learning_ratefloatYesAdam optimizer learning rate
batch_sizeintYesTraining batch size
samples_multiplierintYesMultiplier for effective batch size
epochsintYesTraining epochs per cycle
enabled_threadslistYesWhich threads to start
model_inputdictYesInput channels and bounds
model_outputdictYesOutput channels
kafka_topicsdictYesInput/output topic mapping

RL Control Agent Configuration

rl_control_agent1:
# Environment
environment: "Pendulum-v1"

# SOCT Agent Type
soct_agent_type: "KerasTD3-v0" # Options: KerasTD3-v0, KerasSAC-v0
soct_agent_config_path: "keras_td3.cfg"

# Buffer Configuration
buffer_type: "ER-v0" # Experience Replay
buffer_size: 1000000

# Thread Control
enabled_threads: ['ingest', 'training', 'inference']

# Kafka Topics
kafka_topics:
input_sarsa: "gymnasium-sarsa"
input_state: "gymnasium-state"
output_action: "gymnasium-action"

# Data Ingest Configuration
data_ingest:
use_pipeline_sync: true
pipeline_timeout_sec: 100.0

# Training Configuration
training:
check_interval_ms: 10
use_pipeline_sync: true
pipeline_timeout_sec: 100.0
lock_timeout_sec: 2.0

# Inference Configuration
inference:
train_mode: true # Exploration vs exploitation
use_pipeline_sync: true
pipeline_timeout_sec: 100.0
log_lock_wait_threshold_ms: 100

# Logging
logdir: "./logs/rl_agent1"

RL Agent Configuration Fields

FieldTypeRequiredDescription
environmentstringYesGym environment ID
soct_agent_typestringYesSOCT algorithm (TD3, SAC)
soct_agent_config_pathstringNoPath to SOCT config file
buffer_typestringYesReplay buffer type
buffer_sizeintYesReplay buffer capacity
enabled_threadslistYesWhich threads to start
kafka_topicsdictYesTopic mappings
data_ingestdictYesIngestion thread config
trainingdictYesTraining thread config
inferencedictYesInference thread config
logdirstringYesTensorBoard log directory

SOCT Configuration Files

SOCT agent parameters are configured in separate .cfg files located in /orchestration/soct_configs/:

keras_td3.cfg:

{
"warmup_size": "2500",
"batch_size": "256",
"critic_learning_rate": "0.0003",
"actor_learning_rate": "0.0003",
"tau": "0.005",
"discount": "0.99",
"exploration_noise_fraction": "0.1"
}

actor_fcnn.cfg (Actor network):

{
"hidden_layers": 2,
"nodes_per_layer": [256, 256],
"activation_functions": ["relu", "relu", "tanh"]
}

critic_fcnn.cfg (Critic network):

{
"hidden_layers": 2,
"nodes_per_layer": [256, 256],
"activation_functions": ["relu", "relu", "linear"],
"use_bn": "True"
}

Project Configuration

project:
name: "smocs-gymnasium-rl-control"

Purpose: Project identifier for logging, metrics, and organization.